perm filename WHO[SAI,BGB] blob
sn#135680 filedate 1975-02-03 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00014 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 Definitions, Assignments
C00005 00003 Initialization, Main Loop
C00010 00004
C00014 00005 Sw10, Spw -- Spacewar Loops
C00017 00006 Maklin -- Information Retrieval
C00019 00007 which job to do next?
C00022 00008 jblin -- job info for one job
C00028 00009 MOVE A,JBTJL(2)
C00032 00010 System Statistics
C00036 00011 Devices, Files
C00039 00012 Timit, Flchk, Await -- Random routines
C00041 00013 Num, Octout, Sixout, Strng -- Output Routines
C00043 00014 SUBTTL Data
C00045 ENDMK
C⊗;
COMMENT ⊗Definitions, Assignments⊗
DEBMOD←←0
TITLE WHO
EXTERN JOBREL,JOBFF
PDLEN←←40
A←3
B←4
C←5
D←6
T←7
J←10
P←11
SPACE←12
PTR←13
RING←14
TEMP←15
runwin←←=20 ; no. of passes jobs stay in "run" queue (R mode)
NUMJOB←←100
RINGLN←←=30
AVGING←←=15 ;AVERAGING TIME CONSTANT
DDSIZ←←=35
IIISIZ←←=44
DEFINE INC(N),<REPEAT N,<IDPB SPACE,PTR
>>
DEFINE PUT(CHR),<MOVEI A,CHR
IDPB A,PTR
>
DEFINE SLEEP (SEC,AC) <
MOVEI AC,SEC
CALLI AC,31
>
DEFINE STRING (MSG) <
MOVE A,[POINT 7,[ASCIZ /MSG/]]
PUSHJ P,STRNG
>
OPDEF RESET [CALLI]
OPDEF EXIT [CALLI 12]
OPDEF DISMIS[CALLI 400024]
OPDEF SPCWGO[CALLI 400003]
OPDEF PEEK [CALLI 33]
JBTSTS←←210
PRJPRG←←211
JBTSWP←←212
SPWGO←←213
TTIME←←214
UPTIME←←215
CORMAX←←216
DEVLST←←217
TTYTAB←←220
TTNUMS←←221
JOBN←←222
JBTADR←←223
JOBNAM←←225
JOB←←226
SP2GO←←230
JOBQUE←←231
JBTPRI←←232
JBTJL←←233
QNAMS←←235
JBTLIN←←236
JBTJLH←←240
JBTGSL←←242
STBEG←←247
BIGHOL←←255
SHFWAT←←257
PTYJOB←←270
NJOBS←←275
JBTSIN←←307
FIT←←3
FORCE←←2
SEGWAIT←←6
RUNQ←←14
TQ←←15
INTWQ←←12
NULQ←←10
IOWQ←←5
STOPQ←←11
;LH JBTSTS
SHF←←4000
SWP←←2000
JNA←←240000 ;JNA+CMWB (CMWB HOLDS A JOB SLOT ALSO)
JSEG←←1000
JLOG←←10000
JWP←←1
;RH JBTSTS
JLOCK←←100000
JLLENGTH←←=20
DEVNAM←←0
DEVCHR←←1
DEVIOS←←2
DEVSER←←3
DEVMOD←←4
DEVLOG←←5
DEVFIL←←11
DEVEXT←←12
DEVPPN←←14
FILLEN←←16
USETP←←19
DSKDEV←←200000
DIRDEV←←4
TTYDEV←←10
TTYATT←←20000
READB←←200000
WRITEB←←100000
ALTERB←←40000
IOEND←←40
NJRNUL←←22
LOC 124 ;REENTER ADDRESS
RENTR ;MAKE LPT VERSION OF WHO. - REG.
RELOC 0
COMMENT ⊗Initialization, Main Loop⊗
TTYOUT: MOVE A,JOBREL ;HERE TO DO IT ONCE FOR A TTY.
ADDI A,1777
CALLI A,11
JFCL ;SO WHAT IF HE GETS AN ILM
MOVE P,[IOWD PDLEN,PSHDWN]
PUSHJ P,TTYSPW
MOVE A,JOBREL
MOVEM A,JOBFF
ADDI A,2000
CORE A,
JFCL
OUTBUF 0,2
MOVE 2,[POINT 7,TTYBUF]
SKIPE QUICKY
MOVE 2,[POINT 7,QCKHED]
PUSHJ P,TTYSTR
MOVE 2,[POINT 7,BUFSTR] ;TYPE THE WHOLE MESS
PUSHJ P,TTYSTR
MOVE 2,[POINT 7,[BYTE(7)15,12,12]]
PUSHJ P,TTYSTR
CLOSE 0,
RELEAS 0,
EXIT
TTYSTR: ILDB A,2
JUMPE A,[POPJ P,]
SOSG TTYBHD+2
OUTPUT 0,
IDPB A,TTYBHD+1
JRST TTYSTR
RENTR: TROA A,1
START: MOVEI A,0
MOVEM A,RENFLG#
DOIT: RESET
SETZM QUICKY# ;WILL BE TURNED ON FOR SHORT TYPEOUT TO TTY
SETZM ONAPTY# ;ON FOR PTY SO PTY OF DPY DOESN'T GET ESC CHARS
MOVEI A,37 ;SYSTEM JOBREL
PEEK A,
HRLZ A,A
JUMPGE A,.+2
HRRI A,540000
CALL A,['SETPR2'] ;FAILS IF 128<CORE<256. DOESN'T MATTER IF
JFCL ; PDP-6 UP (6 DATAOS ITS OWN PROT).
MOVEI A,-400000(A)
MOVNM A,ADR10#
MOVEI A,TTNUMS
PEEK A,
MOVE B,A
ANDI A,777
MOVNS A
HRLZM A,PTYPTR
SETZB A,C
LSHC A,9
ADD C,A
SETZ A,
LSHC A,9
ADD C,A
SETZ A,
LSHC A,9
ADDI C,1(A) ;INCLUDE CTY
MOVEM C,PTYL0#
MOVEI A,PTYJOB
PEEK A,
HRRM A,PTYPTR#
OLDSYS: MOVNI A,1 ;ONLY DO SSW FROM DPY
GETLIN A ; BECAUSE NON-LOCAL USERS WOULD BOMB OUT
AOJE A,OLDSY1
TLNE A,4000
SETOM ONAPTY ;DON'T TRY TO RESTORE PAGE PRINTER OF PTYJOB USER
TLNE A,420000
SPCWAR 'SSW' ;STOP ALL SPACEWAR
OLDSY1: MOVSI -RINGLN
MOVEM RNGSAV#
SETZM LASTIM ;TABLE FOR COUNTDOWN FROM LAST TIME RUN
MOVE A,[LASTIM,,LASTIM+1]
BLT A,LASTIM+NUMJOB-1
SETZM PASSN#
SETZM AVGRUN#
SETZM AVGK#
MOVEI 1,=1000 ;NO LIMIT IF TYPING
MOVEM 1,LSTLIN
MOVEI 1,1
MOVEM 1,FSTLIN ;START ON LINE 1
SETZ 1,
GETPPN 1,
HRRZM 1,PN1#
SETZ 1,
DSKPPN 1,
HRRZM 1,PN2#
SETOB 1,READY
SKIPE RENFLG
JRST TTYOUT ;FORCE TTY-STYLE OUTPUT AFTER REENTER
GETLIN 1
CAMN 1,[-1]
SETZ 1,
TLNN 1,420000
JRST TTYOUT
SETZM DDSW#
TLNN 1,20000
JRST NOTDD
SETOM DDSW
MOVE 1,CM1
MOVEM 1,CMDWRD
MOVE 1,CM2
MOVEM 1,CMDWR1
NOTDD: MOVEI 1,IIISIZ ;# LINES AT A TIME FOR III
SKIPE DDSW ;DATA-DISK?
MOVEI 1,DDSIZ ;YES, FEWER LINES
MOVEM 1,LSTLIN
LSH 1,-1 ;HALF A SCREEN GLITCHING
MOVEM 1,SCRINC#
IFN DEBMOD,{ SKIPE DEBUG#
JRST [ SETOM OTHER
JRST SLP1]}
IFN 1,< ;CODE FOR DUAL PROCESSOR.
MOVEI 2,1
MOVEM 2,OTHER# ;FIND OUT WHO'S AROUND
MOVE 1,[XWD 400000,[MOVEM 5,OTHER;OTHER IS -1 IF PDP-6 DOWN,
DISMIS]];0 OTHERWISE
SPCWGO 1,
SLP0: SLEEP (0,1) ;WAIT FOR SPACEWAR JOB TO GO
SKIPLE OTHER ;(OTHER SET NON-POSITIVE)
JRST SLP0
;> SETOM OTHER#
MOVE 1,[XWD 200017,SPW]
SKIPL OTHER ;IS THE 6 UP?
SPCWGO 1, ;YES, START MAIN ROUTINE THERE
SKIPN DDSW
PPACT 0
SETZM HOLDIT ;DON'T STOP 10 YET
MOVE 1,[XWD 400017,SW10]
SPCWGO 1, ;START DPY ROUTINE AND AUX MAIN ON PDP-10
SLP1: OUTSTR [ASCIZ /
/]
SETZM RONLY# ;CLEAR RUNNING JOBS ONLY MODE
SETZM FOREVR
INAGAIN:MOVEI A,=120 ;RUN FOR TWO MINUTES
MOVEI B,1
MOVEM B,REPTT
US1: MOVEM A,LCNT#
IFN DEBMOD,{ SKIPE DEBUG
JRST DEBDIS}
US1A: MOVE A,LCNT
INCHRS B ;DOES HE WANT SOMETHING?
SOJG A,[ MOVEI B,1↔CALLI B,31
JRST US1]
CAIN B,15 ;SNARF UP LF IF CR
INCHRW B
JUMPLE A,LEEVE ;DOOMSDAY
US3: MOVE C,SCRINC ;GLITCH INCREMENT
IMUL C,REPTT# ;* # GLITCHES
CAIE B,"↓" ;MOVE TEXT DOWN?
CAIN B,":" ;no TOP key needed
AOJA C,[CAMLE C,FSTLIN# ;YES, LIMIT RETURN
US2: MOVE C,FSTLIN ; TO TOP
MOVNI C,-1(C) ;DECREMENT, NOT INCREMENT
DOWNGO: JSP TEMP,AWAIT ;WAIT FOR PDP-6 IDLE
ADDM C,FSTLIN ;GLITCH WHOLE SCREEN
ADDM C,LSTLIN#
SETOM READY ;SEND 6 OFF ON ANOTHER MISSION
SETZM HOLDIT
SLEEP (0,B)
JRST INAGAIN] ;GLITCH AND REPRIEVE
CAIE B,"↑" ;MOVE TEXT UP?
CAIN B,";" ;no TOP key needed
JRST DOWNGO ;MOVE DOWN
CAIE B,"∞"
CAIN B,"\" ;no TOP key needed
JRST [SETOM FOREVR#↔JRST US1]
CAIE B,"R"
CAIN B,"r"
JRST [SETOM RONLY#↔JRST US0]
CAIE B,"N"
CAIN B,"n"
JRST [SETZM RONLY↔JRST US0]
CAIE B,"M"
CAIN B,"m"
JRST [MOVEM B,RONLY↔JRST US0]
CAIE B,"V"
CAIN B,"v"
JRST [MOVEM B,RONLY↔SETOM VB#↔JRST US2]
CAIL B,"0"
CAILE B,"9"
JRST LEVE
SUBI B,"0"
MOVEM B,REPTT
INCHRW B
JRST US3
LEVE: CAIE B,"E" ;E MEANS EXIT WITHOUT CLEARING
CAIN B,"e"
JRST .+2
JRST LEAVE
DPYSIZ 4001
DPYPOS -=425
JSP TEMP,AWAIT ;WAIT FOR READINESS
SPCWAR 'SSW'
JSP C,DODD ;DISPLAY ONE MORE TIME
PPACT 400000 ;turn pp back on
EXIT 1, ;inhibit reset on exit
JRST START
LEEVE: HRLOI A,377777 ;A LONG TIME
SKIPE FOREVR
JRST US1
LEAVE: RESET
SKIPE ONAPTY
EXIT ;AVOID LEAVING "CP" IN POOR PTY'S INPUT BUF
JSP C,CLEAR
SLEEP (0,1)
PTWR1W [0↔10000+"P"] ;<ESC>P, TURN SCREEN BACK ON
EXIT
DODD: SKIPN DDSW ;ON DATA-DISK?
JRST (C) ;NO, THAT'S EASY
SETZM DDACT
DPYOUT BUFFER
SETOM READY
JRST (C)
CLEAR: SKIPE DDSW
SKIPE ONAPTY
JRST (C)
PTWR1W [0↔10000+"C"]
JRST (C)
US0: SETZM VB#
JRST US2
COMMENT ⊗Sw10, Spw -- Spacewar Loops⊗
DEFINE FULLCHECK {
PUSHJ P,FLCHK
} ;THIS IS HERE FOR GENERALITY, BUT IT BETTER NOT ASSEMBLE INTO
;MORE THAN ONE INSTRUCTION !!
DEFINE AGET(A,B)
{IFL B,{MOVEI A,-B}
IFG B,{MOVE A,B(2)}
ADDI A,(2)
}
; PDP-10 SPACEWAR LOOP, DISPLAYS RESULTS IF III DISPLAY, AND DOES
; THE INFORMATION RETRIEVAL IF THE PDP-6 IS DOWN
SW10: JUMPGE 6,DIE
SETZM DEATHCT#
SKIPE DDACT ;DO NOTHING IF DD STILL GOING
DISMIS
SKIPN OTHER ;WAS THE PDP-6 UP BEFORE?
JUMPGE 5,SW10A ; IT WAS, JUMP IF IT STILL IS
SETOM SIXSTP# ;DOWN, MAKE SURE IT STAYS DOWN WHILE
SKIPE READY
SKIPE SIXGO#
JRST SW10A
SKIPE HOLDIT
JRST [SETZM READY↔DISMIS] ;FAKE IT IF PROG HACKING
MOVE P,[IOWD PDLEN,PSHDWN] ; WE DO ITS JOB
PUSHJ P,MAKLIN ;DO ITS JOB
SW10A: SETZM SIXSTP# ;PDP-6 OK NOW
SKIPN HOLDIT ;DON'T DISPLAY IF SUSPENDED
SKIPE READY ;IF JOB NOT DONE
DISMIS ; JUST GO AWAY
AOS T,SWCT#
SKIPE DDSW
TRNN T,1 ;RUN A LITTLE SLOWER ON DD
JRST 2,@[.+2] ;LEAVE IOT USER MODE
DISMIS
DPYOUT BUFFER ;DISPLAY GOODIES
SETOM READY ;READY FOR MORE
DISMIS
IFN DEBMOD,{
DEBDIS: MOVE P,[IOWD PDLEN,PSHDWN]
PUSHJ P,MAKLIN
DPYOUT BUFFER
JRST US1A
};DEBMOD
DIE: SPCWAR 'SSW' ;FLUSH BOTH SPACEWARS
DISMIS ;AND GO AWAY
; PDP-6 SPACEWAR LOOP, DOES THE INFORMATION RETRIEVAL
SPW: MOVEI ;PREPARE TO MAKE NON-DESTRUCTIVE TESTS
CAMN DDACT ;WAIT IF BUFFER STILL BUSY
CAMN READY#
JRST SPWX ;NOBODY WANTS IT YET
SETOM SIXGO
CAME SIXSTP
JRST SPWX
MOVE P,[IOWD PDLEN,PSHDWN]
PUSHJ P,MAKLIN ;SET UP THE BUFFER
SPWX: SETZM SIXGO
DISMIS
COMMENT ⊗Maklin -- Information Retrieval⊗
TTYSPW: RESCAN ;FROM TTY, MAYBE SHORT MODE
PUSH P,1
PUSH P,3
MOVEI 1,0
ARRAY TTYBHD[3]
MOVSI 3,TTYBHD
MOVSI 2,'TTY'
SKIPE RENFLG
MOVSI 2,'LPT'
OPEN 0,1
HALT .-1
POP P,3
POP P,1
TTYSP2: INCHWL 2
ANDI 2,177 ;HOW WOULD BUCKY BITS GET IN ANYWAY?
CAIE 2,175
CAIN 2,12
JRST TTYSP3 ;EOL
CAIE 2,"/"
JRST TTYSP2
INCHWL 2
CAIE 2,"Q"
CAIN 2,"q"
SETOM QUICKY
JRST TTYSP2
MAKLIN: IFN DEBMOD,{SKIPN DEBUG}
CONSZ 40 ;IS THERE A SECOND PR-REL BOX?
TTYSP3: JRST [ MOVE 2,ADR10 ;YES, USE SETPR2 MAPPING
JRST PDP10WIN]
HRROS 2 ;NO, MAKE INFINITE PROTECTION,
DATAO 0,2 ;AND SET UP FOR WRAPAROUND ADDRESSING
HRRZS 2 ;INTO THE SYSTEM
MOVNS 2
PDP10W: SETZM TSLVL#
SETZM NRUNJ# ;NO. OF RUNNING JOBS
SETZM NRUNK# ;CORE OF RUNNING JOBS
SETZM INK#
SETZM SWPK#
SETZM CANQUIT# ;CAN'T QUIT YET
SKIPE A,HLOC
SETOM 1(A) ;RESTORE BIT 35 OF HALT WORD
SETZM NLINES# ;NO LINES DISPLAYED YET
SETZM RJOB
AOS PASSN
AGET A,JOB
AGET B,JOBQUE
MOVE A,(A)
ADDI B,(A)
MOVM B,(B)
MOVEM B,RQUE#
CAIE B,RUNQ
CAIN B,TQ
MOVEM A,RJOB#
MOVE A,[JOBCOR-1,,JOBCOR]
BLT A,JOBCOR+NUMJOB-1
SETZM LINES# ;START AT LINE 1
COMMENT ⊗which job to do next?⊗
MOVEM P,SAVPDP ;FULLCHECK RESTORES TO HERE WHEN ESCAPING
MOVEI J,1 ;JOB NUMBER IN J
MOVEI SPACE," "
MOVE PTR,[POINT 7,BUFSTR]
MOVEI T,2
MOVEM T,WHICH#
SETZM INDENT# ;INITIALIZE INDENTATION
; RETURN HERE FOR EACH JOB
DOJOBS: MOVE T,2
ADDI T,(J)
MOVE D,JBTSTS(2)
ADDI D,(T)
MOVE D,(D)
TLNN D,JNA
JRST NOJOB
MOVE B,JBTLIN(2)
ADDI B,(T)
MOVE B,(B)
MOVE A,WHICH
XCT (A)[TLNE D,JSEG ;SEGMENTS LAST
PUSHJ P,[PHTEST:TLNN D,JLOG
CAME B,[-1]
CPOPJ1: AOS (P)
POPJ P,]
PUSHJ P,[TLNN D,JSEG
PUSHJ P,PHTEST
JRST CPOPJ1
CAME B,[-1] ;DETACHED TTYS AREN'T PTYS
TLNN B,4000 ;PTY?
POPJ P,
HRRZ C,B ;GET LINE NUMBER
SUB C,PTYL0 ;MAKE IT INDEX INTO PTYJOB
ADD C,PTYPTR
ADDI C,(2) ;RELOCATE
SKIPE (C) ;IF NO JOB #, PRINT AS REAL JOB
AOS (P)
POPJ P,]
];**WHICH
PUSHJ P,JBLIN
NOJOB: ADDI J,1 ;NEXT JOB
CAMG J,JOBN(2) ;ALL DONE?
JRST DOJOBS ;NO, DO IT -- AGAIN
SOSGE A,WHICH
JRST NOSPEC
MOVEI J,1 ;START WITH JOB 1 AGAIN
XCT (A)[JRST SEGTIT
JRST PHANT]
PHANT: FULLCHECK
JRST DOJOBS
STRING <
>
JRST DOJOBS
SEGTIT: SKIPN RONLY ;NO SEGMENTS IF RUNNING ONLY MODE
SKIPE QUICKY ; NOR QUICK MODE
JRST DOJOBS
FULLCHECK
JRST DOJOBS
STRING <
>
FULLCHECK
JRST DOJOBS
STRING <JOB SEGNAM SIZE NJOBS
>
FULLCHECK
JRST DOJOBS
STRING <
>
JRST DOJOBS
COMMENT ⊗jblin -- job info for one job⊗
JBLIN: AOS INDENT
CAMN J,RJOB
SKIPA C,RQUE
SKIPA C,JOBQUE(2)
JRST .+3
ADDI C,(T)
MOVM C,(C)
MOVEM C,HISQUE#
SKIPN WHICH ;DON'T TEST SEGS FOR RUNNING
JRST JBLIN1
SETOM JRUN# ;FLAG JOB AS RUNNING OR NOT
CAIE C,NULQ
CAIN C,STOPQ
JRST JBLIN4
CAIE C,IOWQ
CAIN C,INTWQ
JRST JBLIN4
MOVNI A,runwin+1 ;WILL keep in "RUN" queue for runwin passes
HRLM A,LASTIM(J)
JBLIN4: MOVSI A,1
ADDB A,LASTIM(J)
SKIPGE A
AOSA NRUNJ
JBLIN1: SETZM JRUN
SETZM DOSW# ;ASSUME LINE WON'T BE DISPLAYED
HLLOS LASTIM(J) ;MARK WHETHER LINE DISPLAYED
SKIPN A,RONLY
JRST JBLIN2
JUMPG A,[ MOVE A,PRJPRG(2)
ADDI A,(T)
HRRZ B,(A)
SKIPE VB
JRST VBALL ;VOLLEYBALL PLAYERS ONLY
CAME B,PN1
CAMN B,PN2
JRST JBLIN2
HRRZ B,NUMJOB(A) ;DSKPPN IS RIGHT AFTER JOBNAM
CAME B,PN1
CAMN B,PN2
JRST JBLIN2
JRST NODISP]
SKIPE JRUN
JRST JBLIN2
NODISP: HLLZS LASTIM(J) ;THIS JOB OMITTED
JRST GETSWPK
VBALL: MOVSI A,-VBLNG ;CHECK VOLLEYBALL PLAYER TABLE
VBALL1: CAMN B,VBTAB(A)
JRST JBLIN2 ;YES
AOBJN A,VBALL1
JRST NODISP ;NO
JBLIN2: FULLCHECK ;SHOULD WE DRAW THIS LINE?
JRST GETSWPK ; NO, BUT COLLECT INFORMATION ABOUT JOB
DRAWL: SKIPE QUICKY ;IF QUICK OUTPUT,
JRST [ MOVE A,JBTLIN(2)
ADDI A,(T)
MOVE A,(A)
AOJE A,CHKPTY ; DON'T TYPE DETACHED JOBS
JRST PUTPPN ; JUST PPN AND TTY
]
SKIPA A,INDENT
IDPB SPACE,PTR
SOJG A,.-1
MOVE A,J
IDIVI A,=10
ADDI B,60
JUMPE A,[IDPB B,PTR
IDPB SPACE,PTR
JRST ONEDIG]
ADDI A,60
IDPB A,PTR
IDPB B,PTR
ONEDIG: SKIPN WHICH
JRST ISSEG1
INC 2
MOVE B,QNAMS(2)
ADDI B,(2)
ADD B,HISQUE
MOVE B,(B)
LDB A,[POINT 7,B,6]
IDPB A,PTR
LDB A,[POINT 7,B,13]
IDPB A,PTR
LDB A,[POINT 7,B,20]
IDPB A,PTR
LDB A,[POINT 7,B,27]
IDPB A,PTR
ISSEG1: MOVEI A," "
AGET B,SHFWAT
CAMN J,(B)
MOVEI A,"↔"
TLNE D,SWP
MOVEI A,"*"
AGET B,BIGHOL
CAMN J,FIT(B)
MOVEI A,"↓"
CAMN J,FORCE(B)
MOVEI A,"↑"
CAMN J,SEGWAIT(B)
MOVEI A,"→"
TRNE D,JLOCK
MOVEI A,"⊗" ;INDICATE LOCKED
CAMN J,RJOB
MOVEI A,"-"
MOVE B,JBTSIN(2)
ADDI B,(T)
SKIPE (B)
MOVEI A,"←" ;IN JBTSIN LIST
IDPB A,PTR
SKIPN WHICH
JRST [ MOVEI A," "
TLNN D,JWP
MOVEI A,"W"
IDPB A,PTR
JRST ISSEG2]
INC 2
PUTPPN: MOVE A,PRJPRG(2)
ADDI A,(T)
MOVE B,(A)
PUSHJ P,SIXOUT
INC 2
MOVE A,JBTLIN(2)
ADDI A,(T)
HRLZ A,(A)
JUMPL A,[STRING <DET>
JRST DETLIN]
LSH A,9
ROT A,3
TRNN A,7
TROA A," "
ADDI A,"0"
IDPB A,PTR
ROT A,3
TRZN A,7⊗3
TRNE A,7
TROA A,"0"
HRRI A," "
IDPB A,PTR
HRRI A,"0"⊗-3
ROT A,3
IDPB A,PTR
DETLIN: SKIPE QUICKY ;THAT'S ALL IF QUICKY OUTPUT
JRST NOSW6
INC 1
ISSEG2: INC 1
MOVE A,["STOPQ"⊗1]
MOVE A,JOBNAM(2)
ADDI A,(T)
MOVE B,(A)
PUSHJ P,SIXOUT
INC 1
GETSWPK:MOVE A,JBTADR(2)
ADDI A,(T)
HLRZ A,(A)
ADDI A,1777
IDIVI A,2000
TLNE D,SWP
JRST [ MOVE A,JBTSWP(2)
ADDI A,(T)
MOVE A,(A)
ANDI A,377
ADDM A,SWPK
JRST .+2]
ADDM A,INK
SKIPE JRUN
ADDM A,NRUNK# ;ADD UP CORE FOR RUNNING JOBS
HRRM A,JOBCOR(J)
SKIPN DOSW# ;ARE WE DRAWING?
JRST GETGSL ; NO, COLLECT SL INFO
PUSHJ P,NUM3
PUT "K"
TLNE D,JSEG
JRST [ INC 3
MOVE A,NJOBS(2)
ADDI A,(T)
MOVE A,(A)
PUSHJ P,NUM3
JRST NOSW6]
; INC 1
MOVE A,TTIME(2)
ADDI A,(T)
MOVE A,(A)
IDIVI A,=60
IDIVI A,=3600
JUMPE A,[INC 2
JRST NOHOUR]
ADDI A,60
IDPB A,PTR
PUT ":"
NOHOUR: IDIVI B,=60*=10
CAIN A,0
JUMPE B,.+2
ADDI B,20
ADDI B,40
IDPB B,PTR
MOVE A,C
IDIVI A,=60
ADDI A,60
IDPB A,PTR
PUT ":"
IDIVI B,=10
ADDI B,60
IDPB B,PTR
ADDI C,60
IDPB C,PTR
INC 1
MOVE A,JBTJL(2)
ADDI A,(T)
SKIPN B,(A)
JRST [ INC 4
JRST NOJL]
ADDI B,(2)
MOVEI C,JLLENGTH
SETZ A,
JLOOP: ADD A,(B)
ADDI B,1
SOJG C,JLOOP
IMULI A,=100
HLRZS A
IDIVI A,JLLENGTH
CAIL A,=100
MOVEI A,=99
SKIPN A
JRST [ INC 3
JRST NOJL]
PUSHJ P,NUM
PUT "%"
NOJL: INC 1
GETGSL: MOVE A,JBTGSL(2)
ADDI A,(T)
HRRZ A,(A)
MOVE B,J
MOVE C,PRJPRG(2)
ADDI C,(T)
HRRZ D,(C)
SUBI B,1
SLOOP: SUBI C,1
HRRZ RING,(C)
CAMN RING,D
JRST NOADD
SOJG B,SLOOP
ADDIT: ADDM A,TSLVL
NOADD: SKIPN DOSW ;ARE WE DRAWING?
JRST NOSL2 ;NO
ADDI A,400000/=100 ;ROUND HIS SERVICE LEVEL
IMULI A,=100
HLRZS A
JUMPE A,[INC 3
JRST NOSLVL]
PUSHJ P,NUM
PUT "%"
NOSLVL: INC 2
NOSL2: MOVE A,JBTSTS(2)
ADDI A,(T)
LDB A,[POINT 6,(A),35] ;SEGMENT NUMBER
MOVE D,A
SKIPN DOSW
JRST NOSEG
JUMPE A,[INC 4
JRST NOSEG]
PUSHJ P,NUM
INC 2
NOSEG: MOVE A,SPWGO(2)
ADDI A,(T)
HLRZ A,(A)
ANDI A,17
JUMPE A,[SKIPN DOSW
JRST NOSW10
INC 2
JRST NOSW10]
HRRZS JOBCOR(J)
HRRZS JOBCOR(D)
SKIPN DOSW ;ARE WE DRAWING?
JRST NOSW10 ; NO
IDIVI A,10
JUMPE A,.+2
ADDI A,20
ADDI A,40
IDPB A,PTR
ADDI B,60
IDPB B,PTR
NOSW10: MOVE A,SP2GO(2)
ADDI A,(2)
ADDI A,(J)
HLRZ A,(A)
ANDI A,17
JUMPE A,NOSW6
HRRZS JOBCOR(J)
HRRZS JOBCOR(D)
SKIPN DOSW
JRST NOSW6 ;FORGET IF NOT DRAWING
INC 2
IDIVI A,10
JUMPE A,.+2
ADDI A,20
ADDI A,40
IDPB A,PTR
ADDI B,60
IDPB B,PTR
NOSW6: SKIPN DOSW
JRST CHKPTY
PUT 15
PUT 12
CHKPTY:
MOVE A,PTYPTR
ADDI A,(2)
HLL A,PTYPTR
CKPTY1: CAME J,(A)
JRST CKPTY2
PUSH P,A
SUB A,PTYPTR
ADD A,PTYL0
MOVE B,TTYTAB(2)
ADDI B,(A)
SKIPN B,(B)
JRST CKPTY3
ADDI B,(2)
PUSH P,J
LDB J,[POINT 6,1(B),5]
MOVE T,J
ADDI T,(2)
MOVE D,JBTSTS(2)
ADDI D,(T)
MOVE D,(D)
TLNE D,JNA ;JOB HERE?
PUSHJ P,JBLIN
POP P,J
CKPTY3: POP P,A
CKPTY2: AOBJN A,CKPTY1
SOS INDENT
POPJ P,
COMMENT ⊗System Statistics⊗
NOSPEC: SKIPE QUICKY
JRST FULL
FULLCHECK
JRST NL1 ;NOT DRAWING THIS LINE
INC 1
PUT 15
PUT 12
NL1: FULLCHECK
JRST NL2
STRING < UPTIME= >
NL2: MOVE RING,RNGSAV
MOVE A,UPTIME(2)
ADDI A,(2)
MOVE A,(A)
MOVEM A,RUN(RING)
SKIPN DOSW
JRST NL3
IDIVI A,=60*=60 ;MAKE IT MINUTES
IDIVI A,=60*=24 ;GET DAYS
PUSH P,B
JUMPE A,NODAYS
PUSHJ P,NUM3
STRING < da >
NODAYS: POP P,A
IDIVI A,=60
MOVE C,B
PUSHJ P,NUM
STRING < hr >
MOVE A,C
PUSHJ P,NUM
STRING < min
>
NL3: MOVE A,[POINT 7,[ASCIZ/ NULTIMES /]]
MOVE C,TTIME(2)
MOVE D,[,NUL(RING)]
PUSHJ P,TIMIT
MOVE A,[440700,,[ASCIZ/ WASTED /]]
MOVE C,STBEG(2)
ADDI C,NJRNUL
MOVE D,[,LOST(RING)]
PUSHJ P,TIMIT
FULLCHECK
JRST NL4 ;DON'T DRAW IF NOT DRAWING
STRING < CORE: >
MOVE A,INK
PUSHJ P,NUM3
PUT "K"
INC 1
MOVE A,SWPK
PUSHJ P,NUM3
STRING <K*
>
NL4: FULLCHECK
JRST NL5A
STRING < USABLE >
AGET A,BIGHOL
MOVE A,(A)
PUSHJ P,NUM3
STRING <K >
MOVEI J,NUMJOB-1
MOVEI A,
SKIPL JOBCOR(J)
ADD A,JOBCOR(J)
SOJG J,.-2
AGET D,CORMAX
MOVE D,(D)
LSH D,-12
SUBM D,A
PUSHJ P,NUM3
STRING <K >
MOVE A,D
PUSHJ P,NUM3
STRING <K
>
NL5A: MOVEI C,AVGING
CAMLE C,PASSN ;AVG. HARD WHILE STARTING UP
MOVEI C,2
HRLZ A,NRUNK
SUB A,AVGK
EXCH A,AVGK
IMUL A,C
ADD A,AVGK
IDIV A,C
MOVEM A,AVGK
HRLZ A,NRUNJ
SUB A,AVGRUN
EXCH A,AVGRUN
IMUL A,C
ADD A,AVGRUN
IDIV A,C
MOVEM A,AVGRUN
FULLCHECK
JRST NL5
STRING < RUNNING JOBS=>
HLRZ A,AVGRUN
PUSHJ P,NUM3
STRING <, >
HLRZ A,AVGK
PUSHJ P,NUM3
STRING <K
>
NL5: FULLCHECK
JRST NL6
STRING < TOTAL SLEVEL= >
MOVE A,TSLVL
ADDI A,400000/=100 ;ROUND TOTAL SERVICE LEVEL
IMULI A,=100
HLRZS A
PUSHJ P,NUM
STRING <%
>
NL6: FULLCHECK
JRST NL7
STRING <
>
COMMENT ⊗Devices, Files⊗
NL7: SETOM CANQUIT ;IF LINE OVERFLOW, CAN QUIT
MOVE T,DEVLST(2)
ADDI T,(2)
HLRZ T,(T)
ADDI T,(2)
JRST NODEV
DEVSRC: ADDI T,(2)
LDB A,[POINT 6,DEVCHR(T),5]
HRRZ A,LASTIM(A) ;THIS JOB WAS DISPLAYED??
SKIPE RONLY ;MAKE SURE ALL FILES GET DISPLAYED IN NORMAL MODE
JUMPE A,NODEV ;OTHERWISE, ONLY FOR JOBS ON SCREEN
MOVE D,DEVMOD(T)
TRNE D,600000 ;ASSIGNED OR INITED?
FULLCHECK ;OR NOT TIME YET?
JRST NODEV ;NOT GOING OR NOT TIME YET
MOVE B,DEVLOG(T)
PUSHJ P,SIXOUT
INC 1
MOVE B,DEVNAM(T)
PUSHJ P,SIXOUT
MOVEI A," "
TRNE D,400000
MOVEI A,"#"
IDPB A,PTR
INC 1
LDB A,[POINT 6,DEVCHR(T),5]
PUSHJ P,NUM
TLNE D,DSKDEV
SKIPN B,DEVFIL(T)
JRST CRLF
INC 2
PUSHJ P,SIXOUT
INC 2
HLLZ B,DEVEXT(T)
MOVEI C,3
PUSHJ P,SIXOUT+1
INC 1
MOVE B,DEVPPN(T)
PUSHJ P,SIXOUT
INC 2
MOVE A,FILLEN(T)
ADDI A,177 ;ROUND UP
IDIVI A,200
TRNN A,7700
INC 1
TRNN A,7000
INC 1
PUSHJ P,OCTOUT
INC 2
MOVE A,USETP(T)
TRNN A,7700
INC 1
TRNN A,7000
INC 1
PUSHJ P,OCTOUT
MOVE A,DEVIOS(T)
INC 1
MOVEI B,"R"
TLNE A,READB
IDPB B,PTR
MOVEI B,"W"
TLNE A,WRITEB
IDPB B,PTR
MOVEI B,"A"
TLNE A,ALTERB
IDPB B,PTR
MOVEI B,"E"
TLNE A,IOEND
IDPB B,PTR
CRLF: PUT 15
PUT 12
NODEV: HLRZ T,DEVSER(T)
JUMPN T,DEVSRC
ALLDON: SKIPN DDSW
JRST FULL
MOVEI T,DDSIZ
SUB T,NLINES
JUMPLE T,FULL
FLUP: PUT " " ;NEW SCREEN IS SMALLER - PUT OUT BLANK LINES
PUT 15 ;TO ERASE DD
PUT 12
SOJG T,FLUP
FULL: TDZA A,A
IDPB A,PTR
TLNE PTR,760000
JRST .-2
SETZM 1(PTR) ;ANDY WILL DO THIS ANYWAY, BUT ...
HRRZM PTR,HLOC ;REMEMBER WHERE WE CLOBBERED BIT 35
SUBI PTR,CMDWRD-1-1
HRRZM PTR,BUFFER+1
MOVEM RING,RNGSAV
SETZM READY
POPJ P,
COMMENT ⊗Timit, Flchk, Await -- Random routines⊗
TIMIT: FULLCHECK ;SHOULD WE DRAW THIS LINE?
SKIPA ;NO
PUSHJ P,STRNG
ADDI C,(2)
MOVE A,(C)
MOVE RING,RNGSAV
MOVEM A,@D ;SAVE IT IN RING BUFFER
SKIPN DOSW ;ARE WE DRAWING?
POPJ P,
IMULI A,=100
IDIV A,RUN(RING)
PUSHJ P,NUM
PUT "%"
INC 1
MOVE A,@D
MOVE B,RUN(RING)
AOBJN RING,.+2 ;ADVANCE RING COUNTER
MOVSI RING,-RINGLN
MOVE C,PASSN
CAIG C,RINGLN
JRST [ SUB A,(D)
SUB B,RUN
JRST .+3]
SUB A,@D
SUB B,RUN(RING)
IMULI A,=100
IDIV A,B
PUSHJ P,NUM3
STRING <%
>
POPJ P,
FLCHK: SETZM DOSW ;ASSUME WE WON'T DRAW THIS LINE
AOS TEMP,LINES ;NEXT LINE
CAMLE TEMP,LSTLIN ;ARE WE PAST THE ALLOWABLE END?
JRST [SKIPN CANQUIT ;CRITICAL STUFF DONE?
POPJ P, ; NO, HAVE TO CONTINUE
MOVE P,SAVPDP#;YES,
JRST ALLDON] ; QUIT
CAML TEMP,FSTLIN ;HAVE WE REACHED THE BEGINNING YET?
AOSA (P)
POPJ P,
SETOM DOSW
AOS NLINES ;COUNT LINES DRAWN
POPJ P,
AWAIT: SETOM HOLDIT# ;KEEP 10 FROM DISPLAYING
SKIPN READY ;IS PDP-6 (OR SURROGATE) IDLE?
JRST (TEMP) ; YES, DONE
SLEEP (0,B) ;WAIT FOR 6 TO FINISH
JRST AWAIT
COMMENT ⊗Num, Octout, Sixout, Strng -- Output Routines⊗
NUM: IDIVI A,=10
JUMPE A,.+2
ADDI A,20
ADDI A,40
IDPB A,PTR
ADDI B,60
IDPB B,PTR
movem p,.+2
POPJ P,
0
-1;a bug test by ME: SPACEWAR LOSSAGE AT NUM3
0
NUM3:
movem a,.-1
IDIVI A,=100
JUMPE A,.+2
ADDI A,20
ADDI A,40
IDPB A,PTR
IDIVI B,=10
CAIN A,40
JUMPE B,.+2
ADDI B,20
ADDI B,40
IDPB B,PTR
ADDI C,60
IDPB C,PTR
POPJ P,
OCTOUT: CAIG A,7
INC 1
OCTOU1: IDIVI A,10
HRLM B,(P)
JUMPE A,.+2
PUSHJ P,OCTOU1
HLRZ B,(P)
ADDI B,60
IDPB B,PTR
POPJ P,
SIXOUT: MOVEI C,6
SETZ A,
LSHC A,6
ADDI A,40
IDPB A,PTR
SOJG C,SIXOUT+1
POPJ P,
ST1: IDPB B,PTR
STRNG: ILDB B,A
JUMPN B,ST1
POPJ P,
SUBTTL Data
PSHDWN: BLOCK PDLEN
NUL: BLOCK RINGLN
RUN: BLOCK RINGLN
LOST: BLOCK RINGLN
-1
JOBCOR: BLOCK NUMJOB
LASTIM: BLOCK NUMJOB
QCKHED: ASCIZ /
PPN TTY
/
VBTAB: 'JBR' ;FIRST PLACE BECAUSE IT'S HIS IDEA
' BH' ;AND MY IMPLIMENTATION
'LES'
'JMC'
'JXJ'
'REF'
'MLM'
'BPM'
'PAM'
'DRB'
'RHT'
'BLF'
'DAV'
'DCS'
'LCS'
' YS'
'CDT'
'DEW'
'RCB'
'AHB'
'PAW'
'DWP'
'HJS'
'PMF'
'PVN'
'JFR'
' JJ'
VBLNG←←.-VBTAB
DEFINE CW(C1,B1,C2,B2,C3,B3)
{ <BYTE(8)<B1>,<B2>,<B3>(3)<C1>,<C2>,<C3>>!4 }
CM1: CW 1,46,2,0,3,1
CM2: CW 4,0,4,1,5,10
;CM3: CW 4,0,4,1,5,11
LIT
VAR
HLOC: 0 ;LOC-1 OF HALT IN BUFFER (MUST RESTORE BIT 35)
BUFFER: TRN CMDWRD ;USE OVERLAPPED & DOUBLE FIELD MODES ON DD
0
DDACT: 0 ;XFER IN PROGRESS
CMDWR1 ;WHERE TO SET FIELD
CMDWRD: 0
CMDWR1: BYTE(11)<-777>,640(3)2,1(2)1,2(3)3
TTYBUF: ASCID/
JOB QUEUE P,PN LINE JOBNAM SIZE TIME PL SL SEG SW10 SW6
/
1 ;STOP TTYUUO HERE
BUFSTR:
REPEAT =62*IIISIZ/5,<1
>
END START